// Package ethvlans 用于描述以太网交换机端口的 VLAN 范围
package ethvlans

import (
	"sort"

	"gitee.com/sillyman/simpleUtil/common/empty"
)

// EthVLANs
type EthVLANs map[int]empty.T

// New 创建一个 EthVLANs 实例
// 取值范围是 1-4094，在以太网帧中占位 12 比特
func New(vlans ...int) EthVLANs {
	v := make(EthVLANs)
	v.Add(vlans...)
	return v
}

// Add 添加 VLANs
// 自动忽略小于 0 和大于 4094 的值
func (v EthVLANs) Add(vlans ...int) {
	if v == nil {
		v = make(EthVLANs)
	}
	for _, vid := range vlans {
		if vid >= 1 && vid <= 4094 {
			v[vid] = empty.V
		}
	}
}

// Len 返回vlan的数量
func (v EthVLANs) Len() int { return len(v) }

// Slice 返回一个排序后的切片
func (v EthVLANs) Slice() []int {
	ints := make([]int, 0, len(v))
	for k := range v {
		ints = append(ints, k)
	}
	sort.Ints(ints)
	return ints
}

// IsExist 判断是否包含某个vlan
func (v EthVLANs) IsExist(vlan int) bool {
	_, ok := v[vlan]
	return ok
}
